# -*- coding: utf-8 -*-
"""
------------------------------------------------------------------------------
    File Name:  kewwords_test
    Author   :  wanwei1029
    Date     :  2019/5/4
    Desc     :
------------------------------------------------------------------------------
"""
from samp.utils import file_utils
import samp.samp_logging as sl
import samp.utils.string_utils as strutils
from gensim import corpora, models
import os


logger = sl.get_logger(__name__)
TEMP_FOLDER = r"D:\nas\nlp\keywords\gensim"


def load_train_data(trian_dir):
    return file_utils.read_dir_to_list(trian_dir)


def lsi_keywords(trian_dir):
    raw_data_list = load_train_data(trian_dir)
    texts = [[word for word in raw_data.split("#") if strutils.is_not_blank(word)] for raw_data in raw_data_list]
    logger.debug(texts)
    dictionary = corpora.Dictionary(texts)
    logger.debug(dictionary.token2id)
    dictionary.__getitem__(0)
    logger.debug(dictionary.id2token)
    # id2token是惰性的，要调用才会生成。
    corpus = [dictionary.doc2bow(text) for text in texts]
    logger.debug(corpus)
    # # corpora.MmCorpus.serialize(os.path.join(TEMP_FOLDER, 'my_test.mm'), bow_model)
    # # bow_model = corpora.MmCorpus(os.path.join(TEMP_FOLDER, 'my_test.mm'))
    # print(corpus)
    tfidf = models.TfidfModel(corpus)
    logger.debug(tfidf)
    # 有了tfidf模型，我们就可以计算每个词的权重信息
    # test_id = dictionary.doc2bow(['特朗普'])
    # logger.debug(type(test_id))
    # # logger.debug(tfidf(test_id))
    doc_bow = [(1, 1)]
    # logger.debug(type(doc_bow))
    # print(tfidf[test_id])
    # 以前一直有个错误的想法，想要打印词典中，每个词的tfidf值，但实际是行不通的。
    # 1：模型构造时的参数corpus是一个二维数组，所以调用时也要传一个二维数组,因此，对于同一个词，在不同的参数（文档）中，其值是变的。
    # 2：tfidf是相对于文档而言的，同一个词，在不同的文档中，其权重也是不一样的
    # token_ids = dictionary.token2id
    # for key, value in token_ids.items():
    #     logger.debug(key)
    #     logger.debug(value)
    #     # 这里注意调用tfidf是用[]，而不是用（）
    #     logger.debug(tfidf[[(value, 2)]])
    for text in corpus:
        text_tfidf = tfidf[text]
        logger.debug(text_tfidf)
        sorted_text_tfidf = sorted(text_tfidf, key=lambda x: x[1], reverse=True)
        logger.debug(sorted_text_tfidf)
        keywords = list()
        for word_tfidf in sorted_text_tfidf[0:10]:
            key_word = dictionary.id2token.get(word_tfidf[0])
            keywords.append(key_word)
        logger.debug(keywords)
    logger.debug("lsi模型 begin")
    corpus_tfidf = tfidf[corpus]
    # lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=100)
    lsi = models.LdaModel(corpus_tfidf, id2word=dictionary, num_topics=100)
    # 通过tfidf,生成lsi模型，参数num_topics控制主题的数量。
    topics = lsi.print_topics(-1, 10)
    # print_topics 方法，第一个参数，打印主题的个数，-1打印所有。第二个参数，打印主题最重要的词
    # num_topics 如果大于实际的主题数据，则以实际的主题数量为准
    logger.info(topics)
    logger.debug(lsi.show_topic(0, 16))
    # show_topic 返回指定主题的最重要的前N个词项。
    corpus_lsi = lsi[corpus_tfidf]
    for doc in corpus_lsi:
        logger.debug(doc)
        # 可以看出每个文档对每个主题的相关程序
    logger.debug("计算每个词对应的每个主题的重要度")
    # 用主题模型提取关键字，就是先计算文档的模型值，然后再依次比较所有词，看哪个词的值与文档的最接近，最接近的就是关键词。
    # 这里有个缺陷，就是新词永远提不出来。
    dic = dictionary.token2id
    word_lsi = dict()
    for dic_data in dic:
        logger.debug(dic_data)
        data_list = [dic_data]
        data_tfidf = tfidf[dictionary.doc2bow(data_list)]
        logger.debug("{0} 的tfidf值为{1}".format(dic_data, data_tfidf))
        data_lsi = lsi[data_tfidf]
        logger.debug("{0} 的lsi值为{1}".format(dic_data, data_lsi))
        word_lsi[dic_data] = data_lsi
    logger.info("关键字lsi值大小：{0}".format(len(word_lsi)))
    # 重新读一次目录里文件，提取每篇文章的关键词
    doc_lists = os.listdir(trian_dir)
    for doc in doc_lists:
        filepath = trian_dir + os.path.sep + doc
        if not os.path.isdir(filepath):
            print(file_utils.read_file_to_str(filepath))


def demo():
    """
    """
    filepath = "D:\\nas\\nlp\\keywords\\18681\\processed"
    lsi_keywords(filepath)


if __name__ == '__main__':
    test_method = "demo"
    if test_method == "demo":
        demo()
